﻿using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace AccessImporter
{
    class Program
    {
        static void Main(string[] args)
        {
            new AccessImporter(new ApplicationDatabaseEntities1());
        }

        public class AccessImporter
        {
            private readonly ApplicationDatabaseEntities1 _mModel;

            readonly OleDbConnection _connection;

            /// <summary>
            /// Ctor </summary>
            public AccessImporter(ApplicationDatabaseEntities1 model)
            {
                _mModel = model;

                try
                {
                    _connection = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=access.accdb");
                    _connection.Open();
                    ImportTrattamenti();
                    ImportStatoMateriale();
                    ImportVociManodopera();
                    ImportContacts();
                    ImportMaterialName();
                    ImportMaterial();
                    ImportArticle();
                    ImportOrders();
                    ImportOrderDetails();
                    SetMaterialArticle();

                    // *  set costi vari - questo non è possibile in quanto 
                    //* set lavorazioni
                    //* set trattamenti
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                finally
                {
                    _connection.Close();
                }

                Console.Read();
            }

            decimal GetDoubleFromNullOrSting(string value)
            {
                if (string.IsNullOrWhiteSpace(value))
                    return 0;

                return decimal.Parse(value.ToString());

            }

            private void SetMaterialArticle()
            {
                //                SELECT tblArticoliMain.CodiceArticolo, tblDettagliMaterialeArticoli.QuantitàPerArticolo, tblMagazzinoMateriale.NomeMateriale, tblMagazzinoStatoMateriale.TipoStatoMateriale, tblMagazzinoSezione.TipoSezione, tblMagazzinoMain.DiametroEsterno, tblMagazzinoMain.DiametroInterno, tblMagazzinoMain.ChiaveEsagono, tblMagazzinoMain.LatoMaggiore, tblMagazzinoMain.LatoMinore
                //FROM tblMagazzinoSezione INNER JOIN (tblMagazzinoStatoMateriale INNER JOIN (tblMagazzinoMateriale INNER JOIN (tblMagazzinoMain INNER JOIN (tblArticoliMain INNER JOIN tblDettagliMaterialeArticoli ON tblArticoliMain.ID_tblArticoliMain = tblDettagliMaterialeArticoli.ArticoloID) ON tblMagazzinoMain.ID_tblMagazzinoMain = tblDettagliMaterialeArticoli.MagazzinoID) ON tblMagazzinoMateriale.ID_MagazzinoMateriale = tblMagazzinoMain.Materiale) ON tblMagazzinoStatoMateriale.ID_tblMagazzinoStatoMateriale = tblMagazzinoMain.Stato) ON tblMagazzinoSezione.ID_tblMagazzinoSezione = tblMagazzinoMain.Sezione;

                var cmd = new OleDbCommand(@"SELECT tblArticoliMain.CodiceArticolo, tblDettagliMaterialeArticoli.QuantitàPerArticolo, tblMagazzinoMateriale.NomeMateriale, tblMagazzinoStatoMateriale.TipoStatoMateriale, tblMagazzinoSezione.TipoSezione, tblMagazzinoMain.DiametroEsterno, tblMagazzinoMain.DiametroInterno, tblMagazzinoMain.ChiaveEsagono, tblMagazzinoMain.LatoMaggiore, tblMagazzinoMain.LatoMinore
FROM tblMagazzinoSezione INNER JOIN (tblMagazzinoStatoMateriale INNER JOIN (tblMagazzinoMateriale INNER JOIN (tblMagazzinoMain INNER JOIN (tblArticoliMain INNER JOIN tblDettagliMaterialeArticoli ON tblArticoliMain.ID_tblArticoliMain = tblDettagliMaterialeArticoli.ArticoloID) ON tblMagazzinoMain.ID_tblMagazzinoMain = tblDettagliMaterialeArticoli.MagazzinoID) ON tblMagazzinoMateriale.ID_MagazzinoMateriale = tblMagazzinoMain.Materiale) ON tblMagazzinoStatoMateriale.ID_tblMagazzinoStatoMateriale = tblMagazzinoMain.Stato) ON tblMagazzinoSezione.ID_tblMagazzinoSezione = tblMagazzinoMain.Sezione;", _connection);

                /*
                 *0  codice articolo
                 * qtaperarticolo
                 * nomemateriale
                 *3  tipostatomateriale
                 * tiposezione
                 * diametroe
                 *6 diametrointerno
                 * chiaveesagono
                 * latomaggiore
                 *9  latominore
                 */

                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;
                while (reader.Read()) // if can read row from database
                {
                    try
                    {
                        var dettMat = new DettagliMaterialeArticolo();

                        i++;

                        var codiceArticolo = reader.GetString(0);
                        var qtaPerArticolo = reader.GetValue(1);
                        var nomeMateriale = reader.GetString(2);
                        var statomateriale = reader.GetString(3);
                        var sezione = reader.GetString(4);
                        var diaE = reader.GetValue(5);
                        var diaI = reader.GetValue(6);
                        var chiave = reader.GetValue(7);
                        var latoMaggiore = reader.GetValue(8);
                        var latoMinore = reader.GetValue(9);

                        dettMat.Articoli =
                            _mModel.Articoli.Where(
                                c => c.CodiceArticolo == codiceArticolo).FirstOrDefault();

                        dettMat.LunghezzaPezzo = GetDoubleFromNullOrSting(qtaPerArticolo.ToString());

                        var de = GetDoubleFromNullOrSting(diaE.ToString());
                        var DI = GetDoubleFromNullOrSting(diaI.ToString());
                        var lm = GetDoubleFromNullOrSting(latoMaggiore.ToString());
                        var lmin = GetDoubleFromNullOrSting(latoMinore.ToString());
                        var ch = GetDoubleFromNullOrSting(chiave.ToString());

                        var sex = (byte)GetSezioneEnum(sezione);

                        var mat =
                            _mModel.MaterialiGrezzi.Where(
                                k => k.Materiali.Descrizione == nomeMateriale &&
                                     k.StatiMateriale.Descrizione == statomateriale &&
                                     k.Sezione == sex &&
                                     k.DiametroEsterno == de &&
                                     k.DiametroInterno == DI &&
                                     k.LatoMaggiore == lm &&
                                     k.LatoMinore == lmin &&
                                     k.ChiaveEsagono == ch).FirstOrDefault();

                        if (mat == null)
                        {

                        }
                        dettMat.MaterialiGrezzi = mat;
                        _mModel.DettagliMaterialeArticolo.AddObject(dettMat);

                        Console.WriteLine("Dettaglio Materiale Aggiunto " + dettMat.Articoli.CodiceArticolo);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }


                }
                _mModel.SaveChanges();

            }

            private void ImportTrattamenti()
            {
                var cmd = new OleDbCommand(@"SELECT * from tblArticoliTrattamenti", _connection); // creating query command

                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;

                while (reader.Read()) // if can read row from database
                {
                    i++;
                    //   var codice = reader.GetValue(1).ToString();
                    var descrizione = reader.GetValue(1).ToString();
                    //Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

                    var trattamento = new TrattamentiSuperficiali()
                    {
                        Descrizione = descrizione
                    };

                    _mModel.AddToTrattamentiSuperficiali(trattamento);

                }
                _mModel.SaveChanges();

                Console.WriteLine("Articoli Trattamenti import success ended!");

            }
            private void ImportStatoMateriale()
            {
                var cmd = new OleDbCommand(@"SELECT * from tblMagazzinoStatoMateriale", _connection); // creating query command

                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;

                while (reader.Read()) // if can read row from database
                {
                    i++;
                    //   var codice = reader.GetValue(1).ToString();
                    var descrizione = reader.GetValue(1).ToString();
                    //Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

                    var statoMateriale = new StatiMateriale()
                    {
                        Descrizione = descrizione
                    };

                    _mModel.AddToStatiMateriale(statoMateriale);

                }

                _mModel.SaveChanges();

                Console.WriteLine("statoMateriale import success ended!");

            }
            private void ImportVociManodopera()
            {
                var cmd = new OleDbCommand(@"SELECT * from tblTempiManodoperaLavorazioni", _connection); // creating query command

                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;

                while (reader.Read()) // if can read row from database
                {
                    i++;
                    var costoOrario = reader.GetValue(2).ToString();
                    var descrizione = reader.GetValue(1).ToString();
                    //Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

                    var voceManodopera = new Lavorazioni()
                    {
                        CostoOrario = int.Parse(costoOrario),
                        Descrizione = descrizione
                    };

                    _mModel.AddToLavorazioni(voceManodopera);

                }

                _mModel.SaveChanges();

                Console.WriteLine("voci manodopera import success ended!");

            }
            private void ImportMaterialName()
            {
                var cmd = new OleDbCommand(@"SELECT * from tblMagazzinoMateriale", _connection); // creating query command

                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;

                while (reader.Read()) // if can read row from database
                {
                    i++;
                    var nomeMateriale = reader.GetValue(1).ToString();
                    var pesoSpecifico = reader.GetValue(2).ToString();

                    var materiale = new Materiali()
                    {
                        Descrizione = nomeMateriale,

                        PesoSpecifico = decimal.Parse(pesoSpecifico)

                    };

                    _mModel.AddToMateriali(materiale);
                }

                _mModel.SaveChanges();
                Console.WriteLine("Contatti import success ended!");
            }

            private void ImportContacts()
            {
                var cmd = new OleDbCommand(@"SELECT * from ANAG_tblMain", _connection); // creating query command

                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;

                while (reader.Read()) // if can read row from database
                {
                    i++;
                    var ragioneSociale = reader.GetValue(1).ToString();
                    Console.WriteLine("Importo Contatto >> Ragione Sociale : {0} ", ragioneSociale);

                    var ditta = new Anagrafiche()
                    {
                        RagioneSociale = ragioneSociale
                    };

                    _mModel.Anagrafiche.AddObject(ditta);
                }

                _mModel.SaveChanges();
                Console.WriteLine("Contatti import success ended!");
            }

            public enum SezioneMaterialeEnum : byte
            {
                Tondo,
                Tubo,
                Piatto,
                Quadro,
                Angolare,
                Esagono,
                BarraFilettata,
                TuboQuadro,
                TuboRettangolo,
                NotDefined,
            }
            private void ImportMaterial()
            {
                // Import stato
                var cmd = new OleDbCommand(@"SELECT tblMagazzinoMateriale.NomeMateriale, tblMagazzinoSezione.TipoSezione, tblMagazzinoStatoMateriale.TipoStatoMateriale, 
                tblMagazzinoMain.DiametroEsterno, tblMagazzinoMain.DiametroInterno, tblMagazzinoMain.ChiaveEsagono, tblMagazzinoMain.LatoMaggiore, tblMagazzinoMain.LatoMinore,
                tblMagazzinoMain.Prezzo, tblMagazzinoMain.Quantità, tblMagazzinoMain.LivelloRiordino
                FROM tblMagazzinoStatoMateriale INNER JOIN (tblMagazzinoSezione INNER JOIN (tblMagazzinoMateriale INNER JOIN tblMagazzinoMain ON tblMagazzinoMateriale.ID_MagazzinoMateriale = tblMagazzinoMain.Materiale) ON tblMagazzinoSezione.ID_tblMagazzinoSezione = tblMagazzinoMain.Sezione) ON tblMagazzinoStatoMateriale.ID_tblMagazzinoStatoMateriale = tblMagazzinoMain.Stato", _connection);

                /*
                 *0  nome
                 * sezione
                 * stato
                 *3  diaest
                 * diaint
                 * chiave
                 *6 latomaggiore
                 * latominore
                 * prezzo
                 *9  quantità
                 * livelloriordino
                 */
                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;
                while (reader.Read()) // if can read row from database
                {
                    try
                    {
                        var materialeGrezzo = new MaterialiGrezzi();

                        i++;
                        var nome = reader.GetString(0);
                        var sezione = reader.GetString(1);
                        var stato = reader.GetString(2);

                        materialeGrezzo.DiametroEsterno = GetCorrectValueNotNullable(reader.GetValue(3).ToString());

                        materialeGrezzo.DiametroInterno = GetCorrectValueNotNullable(reader.GetValue(4).ToString());
                        materialeGrezzo.ChiaveEsagono = GetCorrectValueNotNullable(reader.GetValue(5).ToString());
                        materialeGrezzo.LatoMaggiore = GetCorrectValueNotNullable(reader.GetValue(6).ToString());
                        materialeGrezzo.LatoMinore = GetCorrectValueNotNullable(reader.GetValue(7).ToString());
                        materialeGrezzo.PrezzoEuroKg = GetCorrectValueNotNullable(reader.GetValue(8).ToString());
                        materialeGrezzo.QuantitàMagazzino = GetCorrectValueNotNullable(reader.GetValue(9).ToString());
                        materialeGrezzo.QuantitaRiordino = GetCorrectValueNotNullable(reader.GetValue(10).ToString());



                        var sezione1 = GetSezioneEnum(sezione);
                        if (sezione1 == SezioneMaterialeEnum.NotDefined) { }

                        materialeGrezzo.Sezione = (byte)sezione1;

                        var mat = (from tipo in _mModel.Materiali
                                   where tipo.Descrizione == nome
                                   select tipo).FirstOrDefault();

                        if (mat == null) { }

                        materialeGrezzo.Materiali = mat;
                        var s = (from stat in _mModel.StatiMateriale
                                 where stat.Descrizione == stato
                                 select stat).FirstOrDefault();

                        if (s == null) { }

                        materialeGrezzo.StatiMateriale = s;

                        Console.WriteLine("{0} : {1} : {2} : ", nome, sezione, stato);

                        _mModel.AddToMaterialiGrezzi(materialeGrezzo);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }


                }
                _mModel.SaveChanges();

            }
            private static SezioneMaterialeEnum GetSezioneEnum(string sezione)
            {
                switch (sezione)
                {
                    case "Tondo":
                        return SezioneMaterialeEnum.Tondo;

                    case "Tubo":
                        return SezioneMaterialeEnum.Tubo;

                    case "Piatto":
                        return SezioneMaterialeEnum.Piatto;

                    case "Quadro":
                        return SezioneMaterialeEnum.Quadro;

                    case "Esagono":
                        return SezioneMaterialeEnum.Esagono;

                    case "Angolare":
                        return SezioneMaterialeEnum.Angolare;

                    case "Barra Filettata":
                        return SezioneMaterialeEnum.BarraFilettata;

                    default:
                        return SezioneMaterialeEnum.NotDefined;
                        break;
                }

                throw new Exception("sezione materiale non trovata");

            }
            private void ImportArticle()
            {
                var cmd = new OleDbCommand(@"SELECT tblArticoliMain.CodiceArticolo, tblArticoliMain.DescrizioneArticolo, tblArticoliMain.ProgTornio, tblArticoliMain.ProgCentro, tblArticoliMain.Memo, tblArticoliTrattamenti.NomeTrattamento
FROM tblArticoliTrattamenti RIGHT JOIN tblArticoliMain ON tblArticoliTrattamenti.ID_Trattamento = tblArticoliMain.TrattamentoID;
", _connection); // creating query command

                var reader = cmd.ExecuteReader(); // executes query

                var i = 0;

                while (reader.Read()) // if can read row from database
                {
                    i++;
                    var codice = reader.GetValue(0).ToString();
                    var descrizione = reader.GetValue(1).ToString();
                    var progTornio = reader.GetValue(2).ToString();
                    var progCentro = reader.GetValue(3).ToString();


                    var memo = reader.GetValue(4).ToString();

                    object nomeTrattamentoV =  reader[5];
                    Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

                    var articolo = new Articoli()
                                       {
                                           CodiceArticolo = codice,
                                           Descrizione = descrizione,
                                           ProgCentro = progCentro,
                                           ProgTornio = progTornio,
                                           Memo = memo,

                                       };

                    if (nomeTrattamentoV != null)
                    {
                        var nomeTrattamento = nomeTrattamentoV.ToString();

                        articolo.TrattamentiSuperficiali =
                            _mModel.TrattamentiSuperficiali.Where(
                                s => s.Descrizione == nomeTrattamento).FirstOrDefault();
                    }

                    _mModel.AddToArticoli(articolo);

                }

                _mModel.SaveChanges();
                Console.WriteLine(i + "Articoli import success ended!");
            }
            // backup
            //private void ImportArticle()
            //{
            //    var cmd = new OleDbCommand(@"SELECT * from tblArticoliMain", _connection); // creating query command

            //    var reader = cmd.ExecuteReader(); // executes query

            //    var i = 0;

            //    while (reader.Read()) // if can read row from database
            //    {
            //        i++;
            //        var codice = reader.GetValue(1).ToString();
            //        var descrizione = reader.GetValue(2).ToString();
            //        var progTornio = reader.GetValue(4).ToString();
            //        var progCentro = reader.GetValue(5).ToString();
            //        Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

            //        var articolo = new Articoli()
            //        {
            //            CodiceArticolo = codice,
            //            Descrizione = descrizione,
            //            ProgCentro = progCentro,
            //            ProgTornio = progTornio
            //        };

            //        _mModel.AddToArticoli(articolo);

            //    }

            //    _mModel.SaveChanges();
            //    Console.WriteLine("Articoli import success ended!");
            //}
            private void ImportOrders()
            {
                var cmd = new OleDbCommand(@"SELECT tblOrdiniCliente.CodiceOrdine, ANAG_tblMain.RagioneSociale, tblOrdiniCliente.DataOrdine, tblOrdiniCliente.Evaso, tblOrdiniCliente.Preventivo
FROM ANAG_tblMain INNER JOIN tblOrdiniCliente ON ANAG_tblMain.ID_tblAngraficheMain = tblOrdiniCliente.ClienteID", _connection); // creating query command

                /*
                 * codice ordine
                 * ragione sociale
                 * data ordine
                 * evaso
                 * preventivo
                 * 
                 */
                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;
                while (reader.Read()) // if can read row from database
                {
                    try
                    {
                        i++;
                        var codice = reader.GetValue(0).ToString();
                        var ragioneSociale = reader.GetString(1);

                        var dataRaw = reader.GetValue(2).ToString();

                        var evaso = reader.GetBoolean(3);
                        var isPreventivo = reader.GetBoolean(4);

                        Console.WriteLine("{0} : Importo Ordine >> Codice : {1} ", i, codice);

                        Documenti newOrd = new Documenti();
                        if (isPreventivo)
                            newOrd.TipoDocumento = 1;
                        else
                        {
                            newOrd.TipoDocumento = 0;
                        }

                        newOrd.CodiceDocumentoEsterno = codice;
                        newOrd.Archiviato = evaso;
                        newOrd.Anagrafiche = (from c in _mModel.Anagrafiche
                                              where c.RagioneSociale == ragioneSociale
                                              select c).FirstOrDefault();


                        if (!string.IsNullOrEmpty(dataRaw))
                        {

                            DateTime date;
                            //DateTime.TryParseExact(dataRaw, "dd/MM/yyyy HH:mm:ss", null,
                            //                       System.Globalization.DateTimeStyles.AssumeLocal, out date);

                            var ok = DateTime.TryParse(dataRaw, out date);
                            if (ok)
                                newOrd.Data = date;
                            else
                            {
                            }

                        }

                        _mModel.AddToDocumenti(newOrd);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.ToString());
                    }
                }

                _mModel.SaveChanges();
                Console.WriteLine("Ordini import success ended!");

            }
            //public enum StatoAvanzamento
            //{0126
            //    MaterialeOrdinato,
            //    TagliatoInCoda,
            //    InCoda,
            //    InTrattamento,
            //    DaConsegnare,
            //    Consegnato,
            //    MaterialeDaTagliare,
            //}

            // magare fare con indice se dà problemi.
            private short? GetStatoIndex(string desc)
            {

                switch (desc)
                {
                    case "In Coda":
                        return 2;
                    case "DA Trattare":
                        return 3;
                    case "Consegnato":
                        return 5;
                    case "Tagliato(In Coda)":
                        return 1;
                    case "Mat.Ordinato (In Coda)":
                        return 0;

                    default:
                        return null;
                }
            }
            // Deve importare anche stato.
            void ImportOrderDetails()
            {
                var cmd = new OleDbCommand(@"SELECT tblOrdiniCliente.CodiceOrdine, tblOrdiniCliente.DataOrdine, tblArticoliMain.CodiceArticolo, tblOrdiniClienteDettaglio.QuantitàArticolo, tblOrdiniClienteDettaglio.ConsegnaArticolo, tblOrdiniClienteDettaglio.PrezzoArticolo, tblDettaglioOrdineStato.NomeStato, tblOrdiniClienteDettaglio.ID_OrdineClienteDettaglio
FROM tblOrdiniCliente INNER JOIN (tblDettaglioOrdineStato INNER JOIN (tblArticoliMain INNER JOIN tblOrdiniClienteDettaglio ON tblArticoliMain.ID_tblArticoliMain = tblOrdiniClienteDettaglio.Articolo_ID) ON tblDettaglioOrdineStato.ID_StatoDettaglioOrdine = tblOrdiniClienteDettaglio.StatoID) ON tblOrdiniCliente.ID_OrdiniCliente = tblOrdiniClienteDettaglio.Ordine_ID;
", _connection);

                var reader = cmd.ExecuteReader(); // executes query
                var i = 0;
                while (reader.Read()) // if can read row from database
                {
                    try
                    {
                        i++;

                        var dettaglio = new DettagliDocumento();

                        /*
                         * 0 codice
                         * 1 data
                         * 2 articolo
                         * 3 qtà
                         * 4 data consegna
                         * 5 prezzo
                         * 6 statoDettaglio
                         * 7 Dettaglio Ordine
                         */

                        /*
                         * CANCELLARE ORDINE SENZA DATA !!
                         */

                        var dettaglioId = reader.GetInt32(7);

                        var codiceOrd = reader.GetString(0);

                        var stato = reader.GetString(6);

                        var dataRaw = reader.GetValue(1).ToString();

                        var dateConvOk = false;
                        DateTime dataOrd = DateTime.Today;
                        if (!string.IsNullOrEmpty(dataRaw))
                        {
                            dateConvOk = DateTime.TryParse(dataRaw, out dataOrd);
                        }
                        else
                        {

                        }

                        var indiceStato = GetStatoIndex(stato);

                        dettaglio.StatoAvanzamento = indiceStato;

                        //DateTime.TryParseExact(dataRaw, "dd/MM/yyyy HH:mm:ss", null, System.Globalization.DateTimeStyles.AssumeLocal, out dataOrd);

                        var codiceArt = reader.GetString(2);

                        if (dateConvOk)
                            dettaglio.Documenti = (from ord in _mModel.Documenti
                                                   where ord.CodiceDocumentoEsterno == codiceOrd
                                                   where ord.Data.HasValue && ord.Data.Value == dataOrd
                                                   select ord).FirstOrDefault();
                        else
                        {
                            dettaglio.Documenti = (from ord in _mModel.Documenti
                                                   where ord.CodiceDocumentoEsterno == codiceOrd
                                                   select ord).FirstOrDefault();
                        }

                        dettaglio.Articoli = (from art in _mModel.Articoli
                                              where art.CodiceArticolo == codiceArt
                                              select art).FirstOrDefault();

                        //dettaglio.OrdineDettaglioStato = (from ods in _mModel.OrdineDettaglioStati
                        //                                  where ods.Descrizione == stato
                        //                                  select ods).FirstOrDefault();

                        dettaglio.PrezzoUnitario = (decimal)GetCorrectValueNotNullable(reader.GetValue(5).ToString());
                        dettaglio.Quantità = (int)GetCorrectValueNotNullable(reader.GetValue(3).ToString());

                        string dataConsRaw = reader.GetValue(4).ToString();

                        if (!string.IsNullOrEmpty(dataConsRaw))
                        {
                            DateTime dataCons;
                            //DateTime.TryParseExact(dataRaw, "dd/MM/yyyy HH:mm:ss", null, System.Globalization.DateTimeStyles.AssumeLocal, out dataCons);
                            if (DateTime.TryParse(dataConsRaw, out dataCons))
                                dettaglio.DataConsegna = dataCons;
                            else
                            {
                            }


                        }


                        Console.WriteLine("OrdineDettaglio >> {0} : {1} : {2} pz ", codiceOrd, codiceArt, dettaglio.Quantità);

                        _mModel.AddToDettagliDocumento(dettaglio);

                        // Aggiungo dettagli lavorazioni
                        var cmdDettaglio = new OleDbCommand(@"SELECT tblTempiManodoperaOrdini.DettaglioOrdineID, tblTempiManodoperaOrdini.Ore, tblTempiManodoperaOrdini.Minuti, tblTempiManodoperaLavorazioni.TipoLavorazione
FROM tblTempiManodoperaOrdini INNER JOIN tblTempiManodoperaLavorazioni ON tblTempiManodoperaOrdini.LavorazioneID = tblTempiManodoperaLavorazioni.ID_tblLavorazioni
WHERE (((tblTempiManodoperaOrdini.DettaglioOrdineID)=" + dettaglioId + "));", _connection);

                        var readerD = cmdDettaglio.ExecuteReader(); // executes query
                        var iD = 0;
                        if (readerD != null)
                            while (readerD.Read()) // if can read row from database
                            {
                                var ore = readerD.GetValue(1).ToString();
                                var minuti = readerD.GetValue(2).ToString();
                                var lavDesc = readerD.GetString(3);
                                try
                                {
                                    var dLav = new DettagliLavorazione();
                                    dLav.DettagliDocumento = dettaglio;
                                    dLav.Lavorazioni = _mModel.Lavorazioni.Where(l => l.Descrizione == lavDesc).FirstOrDefault();
                                    dLav.Ore = int.Parse(ore);
                                    dLav.Minuti = int.Parse(minuti);

                                    iD++;
                                }
                                catch (Exception exception)
                                {

                                }
                            }

                      //  _mModel.SaveChanges();

                    }
                    catch (Exception ex)
                    {
                    }


                }
                _mModel.SaveChanges();

            }

            /// <summary>
            /// Cancella contenuto database
            /// </summary>
            //void deleteAll()
            //{
            //}

            //#region ImportDettagliMateriale
            ///// <summary>
            ///// Importa Articoli
            ///// </summary>
            //private void importDettagliMateriali()
            //{
            //    OleDbCommand cmd = new OleDbCommand(@"SELECT * from tblDettagliMaterialeArticoli", connection); // creating query command

            //    OleDbDataReader reader = cmd.ExecuteReader(); // executes query
            //    int i = 0;
            //    while (reader.Read()) // if can read row from database
            //    {
            //        i++;
            //        string codice = reader.GetValue(1).ToString();
            //        string descrizione = reader.GetValue(2).ToString();
            //        Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

            //        Particolare newPart = new Particolare();
            //        newPart.Codice = codice;
            //        newPart.Descrizione = descrizione;

            //        m_model.AddToArticoli(newPart);

            //    }

            //    Console.WriteLine("Articoli import success ended!");
            //}
            //#endregion

            //#region ImportDettagliCostiVari
            ///// <summary>
            ///// Importa Articoli
            ///// </summary>
            //private void importVariCosti()
            //{
            //    OleDbCommand cmd = new OleDbCommand(@"SELECT * from tblArticoliMain", connection); // creating query command

            //    OleDbDataReader reader = cmd.ExecuteReader(); // executes query
            //    int i = 0;
            //    while (reader.Read()) // if can read row from database
            //    {
            //        i++;
            //        string codice = reader.GetValue(1).ToString();
            //        string descrizione = reader.GetValue(2).ToString();
            //        Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

            //        Particolare newPart = new Particolare();
            //        newPart.Codice = codice;
            //        newPart.Descrizione = descrizione;

            //        m_model.AddToArticoli(newPart);

            //    }

            //    Console.WriteLine("Articoli import success ended!");
            //}
            //#endregion

            //#region ImportDettagliTempi  
            ///// <summary>
            ///// Importa Articoli
            ///// </summary>
            //private void importTimes()
            //{
            //    OleDbCommand cmd = new OleDbCommand(@"SELECT * from tblArticoliMain", connection); // creating query command

            //    OleDbDataReader reader = cmd.ExecuteReader(); // executes query
            //    int i = 0;
            //    while (reader.Read()) // if can read row from database
            //    {
            //        i++;
            //        string codice = reader.GetValue(1).ToString();
            //        string descrizione = reader.GetValue(2).ToString();
            //        Console.WriteLine("Importo articolo Codice : {0} , Descrizione : {1} ", codice, descrizione);

            //        Particolare newPart = new Particolare();
            //        newPart.Codice = codice;
            //        newPart.Descrizione = descrizione;

            //        m_model.AddToArticoli(newPart);

            //    }

            //    Console.WriteLine("Articoli import success ended!");
            //}
            //#endregion


            /// <summary>
            /// Se valore uguale 0 , ritorna null
            /// </summary>
            /// <param name="str"></param>
            /// <returns></returns>
            static decimal GetCorrectValueNotNullable(string str)
            {
                decimal d;
                decimal.TryParse(str, out d);
                return (decimal)d;
            }

        }
    }

}
